package com.szdxh.license.bo;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;

/**
 * @author 双子的小坏
 * @date 2024/3/25 11:10:30
 * @description : 统一返回体 R
 */
@Data
@Builder
@AllArgsConstructor
public final class R<T> implements Serializable {

    @Serial
    private static final long serialVersionUID = -1227140234016104416L;

    /**
     * 状态码
     */
    private Integer code;

    /**
     * 返回提示消息
     */
    private String msg;

    /**
     * 返回数据
     */
    private Object data;

    public R() {
    }

    /**
     * 构造统一返回结构
     *
     * @param code    业务状态码
     * @param message 业务提示信息
     * @param data    业务返回独享
     * @return R 统一返回体
     */
    private  R<T> base(Integer code, String message, Object data) {
        R<T> r = new R<>();
        r.setCode(code);
        r.setData(data);
        r.setMsg(message);
        return r;
    }

    /**
     * 默认无参业务成功返回
     *
     * @return R 统一返回体
     */
    public  R<T> success() {
        return base(StateCodeEnum.SUCCESS.getCode(), StateCodeEnum.SUCCESS.getMessage(), null);
    }

    /**
     * 自定义提示信息成功返回
     *
     * @param message 提示信息
     * @return R 统一返回体
     */
    public  R<T> success(String message) {
        return base(StateCodeEnum.SUCCESS.getCode(), message, null);
    }


    /**
     * 自定义业务成功返回
     *
     * @param data 返回数据
     * @return R 统一返回体
     */
    public  R<T> success(Object data) {
        return base(StateCodeEnum.SUCCESS.getCode(), StateCodeEnum.SUCCESS.getMessage(), data);
    }

    /**
     * 自定义提示信息和数据成功返回
     *
     * @param message 提示信息
     * @param data    返回数据
     * @return R 统一返回体
     */
    public  R<T> success(String message, Object data) {
        return base(StateCodeEnum.SUCCESS.getCode(), message, data);
    }

    /**
     * 默认无参失败返回
     *
     * @return R 统一返回体
     */
    public  R<T> fail() {
        return base(StateCodeEnum.FAIL.getCode(), StateCodeEnum.FAIL.getMessage(), null);
    }


    /**
     * 自定义失败返回数据
     *
     * @param data 返回数据
     * @return R 统一返回体
     */
    public  R<T> fail(Object data) {
        return base(StateCodeEnum.FAIL.getCode(), StateCodeEnum.FAIL.getMessage(), data);
    }

    /**
     * 自定义失败返回数据
     * @param stateCodeEnum 枚举
     * @return R 统一返回体
     */
    public  R<T> fail(StateCodeEnum stateCodeEnum) {
        return base(stateCodeEnum.getCode(), stateCodeEnum.getMessage(), null);
    }

    /**
     * 自定义提示信息和数据失败返回
     *
     * @param stateCodeEnum 枚举
     * @param data          返回数据
     * @return R 统一返回体
     */
    public  R<T> fail(StateCodeEnum stateCodeEnum, Object data) {
        return base(stateCodeEnum.getCode(), stateCodeEnum.getMessage(), data);
    }

    /**
     *
     * @param code 错误编码
     * @param message 错误信息
     * @return R 统一返回值
     */
    public  R<T> fail(Integer code, String message) {
        return base(code, message, null);
    }
}
